package com.example.testdemo.sqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

/**
 * Created by MrYan on 2018/8/2.
 * 数据库网络数据缓存整合类
 * 针对项目定制的，如需改动，复制出去再改
 *
 * 说明：该类通过项目id 和 服务器地址绑定数据缓存
 * 查询时，同时提供项目id 和 服务器地址，获取缓存内容；
 *
 * 使用方法：存
 * 创建对象后，调用 writable() 方法打开读写权限，调用 insert() 方法插入数据 然后 commit 提交即可
 * 使用方法：取
 * 创建对象后，调用 readable() 方法打开只读权限，调用 query() 方法查询数据 （无需提交）
 *
 */

public class SQLiteCacheHelp extends SQLiteOpenHelper {

    private static final String TABLE_NAME = "caching";
    private static final String PROJECT_ID = "pid";
    private static final String URL = "url";
    private static final String DATA = "data";
    private Context context;
    private SQLiteDatabase db;


    private SQLiteCacheHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    //参数说明
    //context:上下文对象
    //name:数据库名称
    //param:factory
    //version:当前数据库的版本，值必须是整数并且是递增的状态

    private SQLiteCacheHelp(Context context, String name, int version) {
        this(context, name, null, version);
    }

    public SQLiteCacheHelp(Context context) {
        this(context, TABLE_NAME, 1);
        this.context = context;
    }


    /**
     * 创建一个 cache 表
     * projectId 项目的id
     * url 接口地址
     * data 数据
     */

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table " + TABLE_NAME + "(" + PROJECT_ID + " varchar(32)," + URL + " varchar(255)," + DATA + " varchar)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("drop table if exists " + TABLE_NAME);
        onCreate(db);
    }


    /**
     * 创建或打开一个读写的数据库
     */
    public SQLiteCacheHelp writable() {
        this.db = getWritableDatabase();
        if (db.isOpen()) {
            Toast.makeText(context, "打开成功", Toast.LENGTH_SHORT).show();
        }
        return this;
    }

    /**
     * 创建或者打开一个只读的数据库
     */
    public SQLiteCacheHelp readable() {
        this.db = getReadableDatabase();
        return this;
    }

    /**
     * 提交并保存数据，关闭数据库
     */
    public void commit() {
        if (db.isOpen()) {
            db.close();
        }
    }

    /**
     * 插入一条数据
     *
     * @param projectId 项目Id
     * @param url       接口地址
     * @param data      数据
     */
    public SQLiteCacheHelp insert(String projectId, String url, String data) {
        if (contain(projectId, url)) {
            update(projectId, url, data);
            return this;
        }
        ContentValues values = new ContentValues();
        values.put(PROJECT_ID, projectId);
        values.put(URL, url);
        values.put(DATA, data);
        db.insert(TABLE_NAME, null, values);
        return this;
    }

    /**
     * 更新一条数据
     *
     * @param projectId 更新条件
     * @param url       更新条件
     * @param data      更新内容
     */
    private void update(String projectId, String url, String data) {
        ContentValues values = new ContentValues();
        values.put(DATA, data);
        String[] whereArgs = new String[]{projectId, url};
        db.update(TABLE_NAME, values, PROJECT_ID + "=? and " + URL + "=?", whereArgs);
    }


    /**
     * 查询一条数据
     *
     * @param projectId 查询条件，项目id
     * @param url       查询条件，接口地址
     * @return 缓存结果
     */
    public String query(String projectId, String url) {
        String[] columns = new String[]{PROJECT_ID, URL, DATA};
        String[] selectionArgs = new String[]{projectId, url};
        Cursor cursor = db.query(TABLE_NAME, columns, PROJECT_ID + "=? and " + URL + "=?", selectionArgs, null, null, null);
        String result = "";
        while (cursor.moveToNext()) {
            result = cursor.getString(2);
        }
        cursor.close();
        return result;
    }

    /**
     * 查询记录是否存在
     *
     * @return 存在返回 True 否则 返回 False
     */
    public boolean contain(String projectId, String url) {
        boolean isContain;
        String[] columns = new String[]{PROJECT_ID, URL, DATA};
        String[] selectionArgs = new String[]{projectId, url};
        Cursor cursor = db.query(TABLE_NAME, columns, PROJECT_ID + "=? and " + URL + "=?", selectionArgs, null, null, null);
        isContain = cursor.getCount() > 0;
        cursor.close();
        return isContain;
    }


    /**
     * 清除所有数据
     * 慎用！！
     */
    public SQLiteCacheHelp clearAll(){
        db.delete(TABLE_NAME,null,null);
        return this;
    }

}
